package br.com.gbvbahia.mybooks.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import android.content.Context;
import android.text.TextUtils;
import br.com.gbvbahia.mybooks.dao.EditoraDAO;
import br.com.gbvbahia.mybooks.dao.LivroDAO;
import br.com.gbvbahia.mybooks.dao.LivroPrateleiraDAO;
import br.com.gbvbahia.mybooks.dao.PrateleiraDAO;
import br.com.gbvbahia.mybooks.modelos.EditoraVO;
import br.com.gbvbahia.mybooks.modelos.LivroPrateleiraVO;
import br.com.gbvbahia.mybooks.modelos.LivroVO;
import br.com.gbvbahia.mybooks.modelos.PrateleiraVO;

/**
 * Realiza tarefas de servicos locais.
 * @author Guilherme
 *
 */
public class AppService {

	public static final String VALIDACAO_ERROR = "-2";
	private Context ctx;
	private LivroDAO livroDAO;
	private EditoraDAO editoraDAO;
	private PrateleiraDAO prateleiraDAO;
	private LivroPrateleiraDAO livroPrateleiraDAO;

	public AppService(Context ctx) {
		super();
		this.ctx = ctx;
		createDAO();
	}

	/**
	 * Devolve todas as Prateleiras de um determinado livro.
	 * 
	 * @param livro
	 * @return
	 */
	public List<PrateleiraVO> buscarPrateleirasPorLivro(LivroVO livro) {
		List<PrateleiraVO> toReturn = new ArrayList<PrateleiraVO>();
		if (livro == null || livro.getId() == null) {
			return toReturn;
		}
		List<String> idPrateleiras = livroPrateleiraDAO
				.buscarIdPrateleiras(livro.getId(), prateleiraDAO.getDataBase());
		if (idPrateleiras.isEmpty()) {
			return toReturn;
		}
		for (String idPrat : idPrateleiras) {
			PrateleiraVO toAdd = prateleiraDAO.getByID(idPrat);
			if (toAdd != null) {
				toReturn.add(toAdd);
			}
		}
		return toReturn;
	}

	/**
	 * Salva o livro de modo sincrono, se chamado diretamente. Utilize
	 * SalvarLivroTransacao para modo assincrono.
	 * 
	 * @param livro
	 * @param editoraNome
	 * @param prateleriaNome
	 */
	public String salvarLivro(LivroVO livro, String editoraNome,
			String prateleriaNome) {
		if (TextUtils.isEmpty(livro.getNomeLivro())) {
			return VALIDACAO_ERROR;
		}
		definirEditora(livro, editoraNome);
		if (livro.getId() != null) {
			livroDAO.updatePrepare(livro);
		} else {
			livroDAO.insertPrepare(livro);
		}

		if (livro.getId() != null) {
			definirPrateleira(livro, prateleriaNome);
		}
		return livro.getId();
	}

	/**
	 * Insere o ID da editora, somente se tiver criado ou encontrado a mesma.
	 * 
	 * @param livro
	 * @param editoraNome
	 * @return
	 */
	public void definirEditora(LivroVO livro, String editoraNome) {
		if (!TextUtils.isEmpty(editoraNome)) {
			EditoraVO editora = editoraDAO.getEditoraByName(editoraNome);
			if (editora == null) {
				EditoraVO edToSave = new EditoraVO();
				edToSave.setNome(editoraNome);
				editoraDAO.insertPrepare(edToSave);
				livro.setCdEditora(edToSave.getId());
			} else {
				livro.setCdEditora(editora.getId());
			}
		}
	}

	/**
	 * Verifica se houve informa��o de prateleira, se sim, verifica se a mesma
	 * existe, se n�o cria, e vincula o livro a prateleria.
	 * 
	 * @param livro
	 *            Ja deve ter ID
	 * @param prateleriaNome
	 */
	public void definirPrateleira(LivroVO livro, String prateleriaNome) {
		livroPrateleiraDAO.deleteLivro(livro.getId(), prateleiraDAO.getDataBase());
		if (!TextUtils.isEmpty(prateleriaNome)) {
			for (String pratName : prateleriaNome.split(";")) {
				if(StringUtils.isBlank(StringUtils.trim(pratName))){
					continue;
				}
				PrateleiraVO prateleira = prateleiraDAO
						.getPrateleiraByName(pratName.trim());
				if (prateleira == null) {
					PrateleiraVO pratToSave = new PrateleiraVO();
					pratToSave.setNome(pratName.trim());
					LivroPrateleiraVO lp = new LivroPrateleiraVO();
					lp.setCdLivro(livro.getId());
					prateleiraDAO.insertPrepare(pratToSave);
					lp.setCdPrateleira(pratToSave.getId());
					livroPrateleiraDAO.insert(lp, prateleiraDAO.getDataBase());
				} else {
					if (livroPrateleiraDAO.buscarPorIdLivroIdPrateleira(
							livro.getId(), prateleira.getId(), prateleiraDAO.getDataBase()) == null) {
						LivroPrateleiraVO lp = new LivroPrateleiraVO();
						lp.setCdLivro(livro.getId());
						lp.setCdPrateleira(prateleira.getId());
						livroPrateleiraDAO.insert(lp, prateleiraDAO.getDataBase());
					}
				}
			}
		}
	}

	private void createDAO() {
		livroDAO = new LivroDAO(ctx);
		editoraDAO = new EditoraDAO(ctx);
		prateleiraDAO = new PrateleiraDAO(ctx);
		livroPrateleiraDAO = new LivroPrateleiraDAO();
	}

}
